////////////////////////////////////////////////////////////////
//
//       Filename:  genmai.go
//
//        Version:  1.0
//        Created:  2022年10月26日 01时00分32秒
//       Revision:  none
//       Compiler:  go
//
//         Author:  alpha
//   Organization:  alpha
//       Contacts:  chenxinquan@kylinos.cn
//
////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////
// Description:
////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////
// Log:
////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////
// Todo:
//
////////////////////////////////////////////////////////////////

package genmai

import (
"fmt"
"encoding/json"
"os"
)

func SystemCreatFile(rp *ReportSystem,fileName string){

    path:="../data/Report/"+"System:"+fileName+".json"
    _, err := os.Stat(path)
    if err != nil{      
        
    }else{
        fmt.Printf("%c[%d;%d;%dm%s%c[0m\n", 0x1B, 0, 0, 31, "Err: a file with the same name exists", 0x1B)
        return
    }
    file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        fmt.Println("open file failed,err:",err)
        return
    }

    defer file.Close()
    jsonVul, err := json.MarshalIndent(rp, "", "     ")
    if err != nil {
        fmt.Println("json err ", err)
    }
    file.Write([]byte(jsonVul))    //写入字节切片数据

}

func KernelCreatFile(rp *ReportKernel,fileName string){

    path:="../data/Report/"+"Kernel:"+fileName+".json"
    _, err := os.Stat(path)
    if err != nil{      
        
    }else{
        fmt.Printf("%c[%d;%d;%dm%s%c[0m\n", 0x1B, 0, 0, 31, "Err: a file with the same name exists", 0x1B)
        return
    }
    file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        fmt.Println("open file failed,err:",err)
        return
    }

    defer file.Close()
    jsonVul, err := json.MarshalIndent(rp, "", "     ")
    if err != nil {
        fmt.Println("json err ", err)
    }
    file.Write([]byte(jsonVul))    //写入字节切片数据

}

func BaseLineCreatFile(rp *ReportBaseLine,fileName string){

    path:="../data/Report/"+"BaseLine:"+fileName+".json"
    _, err := os.Stat(path)
    if err != nil{      
        
    }else{
        fmt.Printf("%c[%d;%d;%dm%s%c[0m\n", 0x1B, 0, 0, 31, "Err: a file with the same name exists", 0x1B)
        return
    }
    file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
    if err != nil {
        fmt.Println("open file failed,err:",err)
        return
    }

    defer file.Close()
    jsonVul, err := json.MarshalIndent(rp, "", "     ")
    if err != nil {
        fmt.Println("json err ", err)
    }
    file.Write([]byte(jsonVul))    //写入字节切片数据

}


func Kernel(OutPutJson string) {

    DoctorIns().Reset()
    DoctorIns().LoadExplorersListConfig("../data/KernelPocs/KernelPocs.yaml")

    A_DEBUG_INFO(">>Genmai Kernel>>")
    DoctorIns().GenmaiKernel()

}
func System(OutPutJson string) {

    DoctorIns().Reset()
    DoctorIns().LoadExplorersListConfig("../data/SystemPocs/SystemPocs.yaml")

    A_DEBUG_INFO(">>Genmai System>>")
    rp := DoctorIns().GenmaiSystem()
    if len(rp.RCExploredVulns)==0{
        fmt.Println("System info: No vulnerability")
    }else if OutPutJson !="null"{
        SystemCreatFile(rp,OutPutJson)
    }
}
func Web(OutPutJson string) {
    fmt.Println("web")
}
func BaseLine(OutPutJson string){

    DoctorIns().Reset()
    DoctorIns().LoadExplorersListConfig("../data/BaseLine/BaseLine.yaml")

    A_DEBUG_INFO(">>Genmai BaseLine>>")
    rp:=DoctorIns().GenmaiBaseline()
    if len(rp.RCExploredVulns)==0{
        fmt.Println("BaseLine info: No vulnerability")
    }else if OutPutJson !="null"{
        BaseLineCreatFile(rp,OutPutJson)
    }
}
